/**
 * 编辑器核心模块
 * 负责初始化和管理 Quill 富文本编辑器
 */

import ImageManager from './ImageManager.js';

class EditorCore {
  constructor(containerId, toolbarId) {
    this.containerId = containerId;
    this.toolbarId = toolbarId;
    this.quill = null;
    this.currentFile = null;
    this.isModified = false;
    this.eventListeners = new Map();
    this.imageManager = new ImageManager();
  }

  /**
   * 初始化编辑器
   */
  init() {
    // 检查 Quill 是否已加载
    if (typeof Quill === 'undefined') {
      console.error('Quill 库未加载，请确保已正确引入 Quill.js');
      return;
    }
    
    console.log('开始初始化 Quill 编辑器');
    
    // 配置工具栏选项（简化版，避免过多按钮）
    const toolbarOptions = [
      [{ 'header': [1, 2, 3, false] }],
      [{ 'size': ['small', false, 'large'] }],
      ['bold', 'italic', 'underline', 'strike'],
      [{ 'color': [] }, { 'background': [] }],
      [{ 'list': 'ordered'}, { 'list': 'bullet' }],
      [{ 'align': [] }],
      ['blockquote', 'code-block'],
      ['link', 'image'],
      ['clean']
    ];

    // 初始化 Quill 编辑器
    console.log('正在创建 Quill 实例，容器ID:', this.containerId);
    
    this.quill = new Quill(`#${this.containerId}`, {
      theme: 'snow',
      modules: {
        toolbar: {
          container: toolbarOptions,
          handlers: {
            // 自定义图片处理器
            image: this.handleImageInsert.bind(this)
          }
        },
        history: {
          delay: 2000,
          maxStack: 500,
          userOnly: true
        }
      },
      placeholder: '开始编写您的文档...'
    });

    console.log('Quill 编辑器创建成功:', this.quill);

    // 设置中文工具提示
    this.setupChineseTooltips();

    // 绑定事件监听器
    this.bindEvents();
    
    console.log('EditorCore 初始化完成');
  }

  /**
   * 设置中文工具提示
   */
  setupChineseTooltips() {
    const toolbar = this.quill.getModule('toolbar');
    const container = toolbar.container;
    
    // 中文工具提示映射
    const tooltips = {
      '.ql-header[value="1"]': '标题 1',
      '.ql-header[value="2"]': '标题 2',
      '.ql-header[value="3"]': '标题 3',
      '.ql-header[value=""]': '正文',
      '.ql-size[value="small"]': '小字体',
      '.ql-size[value=""]': '正常字体',
      '.ql-size[value="large"]': '大字体',
      '.ql-bold': '粗体',
      '.ql-italic': '斜体',
      '.ql-underline': '下划线',
      '.ql-strike': '删除线',
      '.ql-color': '文字颜色',
      '.ql-background': '背景颜色',
      '.ql-list[value="ordered"]': '有序列表',
      '.ql-list[value="bullet"]': '无序列表',
      '.ql-align[value=""]': '左对齐',
      '.ql-align[value="center"]': '居中对齐',
      '.ql-align[value="right"]': '右对齐',
      '.ql-align[value="justify"]': '两端对齐',
      '.ql-blockquote': '引用',
      '.ql-code-block': '代码块',
      '.ql-link': '链接',
      '.ql-image': '插入图片',
      '.ql-clean': '清除格式'
    };
    
    // 应用中文工具提示
    Object.keys(tooltips).forEach(selector => {
      const element = container.querySelector(selector);
      if (element) {
        element.setAttribute('title', tooltips[selector]);
      }
    });
  }

  /**
   * 绑定事件监听器
   */
  bindEvents() {
    // 监听文本变化
    this.quill.on('text-change', (delta, oldDelta, source) => {
      if (source === 'user') {
        this.isModified = true;
        this.updateWordCount();
        this.emit('content-changed', {
          delta,
          content: this.getContent(),
          length: this.getLength()
        });
      }
    });

    // 监听选择变化
    this.quill.on('selection-change', (range, oldRange, source) => {
      if (range) {
        this.updateCursorPosition(range);
        this.emit('selection-changed', { range, source });
      }
    });

    // 监听粘贴事件，处理剪切板图片
    this.quill.root.addEventListener('paste', async (event) => {
      try {
        console.log('粘贴事件触发');
        console.log('事件类型:', event.type);
        console.log('剪切板数据:', event.clipboardData);
        console.log('Quill实例:', this.quill);
        console.log('ImageManager实例:', this.imageManager);
        
        // 尝试处理剪切板中的图片
        const handled = await this.imageManager.handleClipboardImage(event, this.quill);
        console.log('图片处理结果:', handled);
        
        if (handled) {
          // 如果成功处理了图片，显示提示信息
          console.log('显示粘贴成功提示');
          this.showPasteSuccess();
        }
      } catch (error) {
        console.error('处理剪切板粘贴时出错:', error);
      }
    });
  }

  /**
   * 获取编辑器内容
   * @param {string} format - 格式类型 ('delta', 'html', 'text')
   * @returns {*} 编辑器内容
   */
  getContent(format = 'delta') {
    switch (format) {
      case 'html':
        return this.quill.root.innerHTML;
      case 'text':
        return this.quill.getText();
      case 'delta':
      default:
        return this.quill.getContents();
    }
  }

  /**
   * 设置编辑器内容
   * @param {*} content - 内容
   * @param {string} format - 格式类型
   */
  setContent(content, format = 'delta') {
    switch (format) {
      case 'html':
        this.quill.root.innerHTML = content;
        break;
      case 'text':
        this.quill.setText(content);
        break;
      case 'delta':
      default:
        this.quill.setContents(content);
        break;
    }
    this.isModified = false;
  }

  /**
   * 清空编辑器
   */
  clear() {
    this.quill.setText('');
    this.isModified = false;
    this.currentFile = null;
  }

  /**
   * 获取文本长度
   * @returns {number} 文本长度
   */
  getLength() {
    return this.quill.getLength() - 1; // 减去末尾的换行符
  }

  /**
   * 更新字数统计（带防抖优化）
   */
  updateWordCount() {
    // 清除之前的定时器
    if (this.wordCountTimer) {
      clearTimeout(this.wordCountTimer);
    }
    
    // 使用防抖，避免频繁更新
    this.wordCountTimer = setTimeout(() => {
      const text = this.quill.getText();
      const wordCount = text.trim().split(/\s+/).filter(word => word.length > 0).length;
      const charCount = text.length - 1; // 减去 Quill 自动添加的换行符

      // 更新状态栏
      const statusBar = document.querySelector('.status-bar');
      if (statusBar) {
        const wordCountElement = statusBar.querySelector('.word-count');
        if (wordCountElement) {
          wordCountElement.textContent = `字符: ${charCount} | 单词: ${wordCount}`;
        }
      }
    }, 100); // 100ms 防抖延迟
  }

  /**
   * 更新光标位置显示
   * @param {Object} range - 选择范围
   */
  updateCursorPosition(range) {
    const cursorPosEl = document.getElementById('cursor-position');
    if (cursorPosEl && range) {
      const text = this.quill.getText(0, range.index);
      const lines = text.split('\n');
      const line = lines.length;
      const column = lines[lines.length - 1].length + 1;
      cursorPosEl.textContent = `行: ${line}, 列: ${column}`;
    }
  }

  /**
   * 撤销操作
   */
  undo() {
    this.quill.history.undo();
  }

  /**
   * 重做操作
   */
  redo() {
    this.quill.history.redo();
  }

  /**
   * 获取编辑器实例
   * @returns {Quill} Quill 实例
   */
  getQuillInstance() {
    return this.quill;
  }

  /**
   * 检查是否有未保存的更改
   * @returns {boolean} 是否已修改
   */
  hasUnsavedChanges() {
    return this.isModified;
  }

  /**
   * 标记为已保存
   */
  markAsSaved() {
    this.isModified = false;
  }

  /**
   * 设置当前文件
   * @param {string} filePath - 文件路径
   */
  setCurrentFile(filePath) {
    this.currentFile = filePath;
  }

  /**
   * 获取当前文件
   * @returns {string|null} 当前文件路径
   */
  getCurrentFile() {
    return this.currentFile;
  }

  /**
   * 事件发射器
   * @param {string} event - 事件名称
   * @param {*} data - 事件数据
   */
  emit(event, data) {
    const listeners = this.eventListeners.get(event) || [];
    listeners.forEach(callback => callback(data));
  }

  /**
   * 添加事件监听器
   * @param {string} event - 事件名称
   * @param {Function} callback - 回调函数
   */
  on(event, callback) {
    if (!this.eventListeners.has(event)) {
      this.eventListeners.set(event, []);
    }
    this.eventListeners.get(event).push(callback);
  }

  /**
   * 移除事件监听器
   * @param {string} event - 事件名称
   * @param {Function} callback - 回调函数
   */
  off(event, callback) {
    const listeners = this.eventListeners.get(event) || [];
    const index = listeners.indexOf(callback);
    if (index > -1) {
      listeners.splice(index, 1);
    }
  }

  /**
   * 处理图片插入
   */
  async handleImageInsert() {
    try {
      await this.imageManager.handleImageInsert(this.quill);
      // 标记文档已修改
      this.isModified = true;
      this.emit('content-changed', {
        type: 'image-insert'
      });
    } catch (error) {
      console.error('图片插入处理失败:', error);
    }
  }

  /**
   * 显示粘贴成功提示
   */
  showPasteSuccess() {
    // 创建临时提示元素
    const toast = document.createElement('div');
    toast.className = 'paste-success-toast';
    toast.textContent = '图片粘贴成功！';
    toast.style.cssText = `
      position: fixed;
      top: 20px;
      right: 20px;
      background: #4CAF50;
      color: white;
      padding: 12px 20px;
      border-radius: 4px;
      font-size: 14px;
      z-index: 10000;
      box-shadow: 0 2px 8px rgba(0,0,0,0.2);
      transition: opacity 0.3s ease;
    `;
    
    document.body.appendChild(toast);
    
    // 3秒后自动移除
    setTimeout(() => {
      toast.style.opacity = '0';
      setTimeout(() => {
        if (toast.parentNode) {
          document.body.removeChild(toast);
        }
      }, 300);
    }, 3000);
  }

  /**
   * 销毁编辑器
   */
  destroy() {
    // 清理定时器
    if (this.wordCountTimer) {
      clearTimeout(this.wordCountTimer);
      this.wordCountTimer = null;
    }
    
    // 清理图片管理器
    if (this.imageManager) {
      this.imageManager.destroy();
      this.imageManager = null;
    }
    
    if (this.quill) {
      this.quill = null;
    }
    
    this.eventListeners.clear();
  }
}

export default EditorCore;